package cn.jtfadmin.activiti.service;

import cn.jtfadmin.activiti.domain.dto.*;
import cn.jtfadmin.activiti.domain.entity.FormDesignEntity;
import cn.jtfadmin.base.dict.dto.DictItemModelDTO;
import cn.jtfadmin.base.lang.common.domain.dto.PageRDTO;
import cn.jtfadmin.base.lang.common.domain.dto.ResultDTO;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.repository.Model;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * actService
 * @author jtf
 * @since 0.0.2
 */
public interface ActModelService extends ModelDataJsonConstants {
    /**
     * 新增模型
     * @param addPDTO 新增参数
     * @return
     */
    Model addModel(ModelAddPDTO addPDTO);

    /**
     * 编辑模型
     * @param editPDTO 编辑参数
     * @return
     */
    Model editModel(ModelEditPDTO editPDTO);

    /**
     * 分页查询模型
     * @param name 模型名称
     * @param tenantId 租户id
     * @param pageNo 页码
     * @param pageSize 每页数量
     * @return
     */
    PageRDTO<ModelDTO> listModel(String name, String tenantId, int pageNo, int pageSize);

    /**
     * 删除模型
     * @param id 模型id
     */
    void deleteModel(String id);

    /**
     * 批量删除模型
     * @param ids 模型id
     */
    void deleteBatchModel(String ids);

    /**
     * 部署模型
     * @param id 模型id
     * @param file 表单文件
     */
    void deployModel(String id, String file);
    /**
     * 删除部署
     * @param id 部署id
     */
    void deleteDeployment(String id);

    /**
     * 批量删除部署
     * @param ids 部署id
     */
    void deleteBatchDeployment(String ids);

    /**
     * 通过模型id查询部署id
     * @param modelId 模型id
     * @return
     */
    Set<String> listDeploymentIdsByModelId(String modelId);

    /**
     * 按照模型id获取模型定义
     * @param modelId 模型id
     * @return
     */
    List<ProcessDefinitionDTO> listDefinition(String modelId);

    /**
     * 删除流程定义
     * @param id 流程定义id
     */
    void deleteDefinition(String id);

    /**
     * 更新模型版本
     * @param id 模型id
     * @param version 版本
     */
    void updateModelVersion(String id, Integer version);

    /**
     * 获取模型资源
     * @param id 模型id
     * @return
     */
    byte[] getModelEditorSourceExtra(String id);

    /**
     * 获取流程定义资源
     * @param deploymentId 部署id
     * @param name 资源名称
     * @return
     */
    InputStream getProcessResouce(String deploymentId, String name);

    /**
     * 导出流程模型资源
     * @param ids 流程IDS
     * @param outputStream
     */
    void exportResouce(String ids, OutputStream outputStream);

    /**
     * 新增设计表单
     * @param addPDTO 新增参数
     * @return
     */
    FormDesignEntity addFormDesign(FormDesignAddPDTO addPDTO);

    /**
     * 编辑设计表单
     * @param editPDTO 编辑参数
     * @return
     */
    FormDesignEntity editFormDesign(FormDesignEditPDTO editPDTO);

    /**
     * 按照id删除设计表单
     * @param id
     */
    void deleteFormDesign(String id);

    /**
     * 批量删除设计表单
     * @param ids
     */
    void deleteBatchFormDesign(String ids);

    /**
     * 按照模型id查询设计表单
      * @param modelId
     * @return
     */
    List<FormDesignEntity> listFormDesign(String modelId);

    /**
     * 按照设计表单id获取设计表单
     * @param id
     * @return
     */
    Optional<FormDesignEntity> getFormDesignById(String id);

    /**
     * 修改内容
     * @param id
     * @param content
     */
    void updateFormDesignContent(String id, String content);

    /**
     * 生成你bushukey
     * @param modelId 模型id
     * @return
     */
    String genDeploymentKey(String modelId);

    /**
     * 解析部署key
     * @param deploymentKey 部署key
     * @return 模型id
     */
    String praseModelId(String deploymentKey);

    /**
     * 模型字典
     * @param tenantId
     * @return
     */
    List<DictItemModelDTO> modelNamed(String tenantId);
}
